Qt5.4文档翻译:QQmlContext类,QQmlContext Class
QQmlContext 类在QML 引擎中定义了一个上下文。 详细说明……
头文件: |
#include <QQmlContext> |
qmake指令: |
QT += qml |
继承: |
QObject . |
QQmlContext 类在QML 引擎中定义了一个上下文。
上下文,可用来将数据暴露给该QML 引擎所实例化的QML 组件。
每个 QQmlContext ,都包含一组与其 QObject 属性不同概念的属性,使得,数据 可以显式地按照名字来与上下文绑定起来。 上下文属性是通过调用 QQmlContext::setContextProperty ()来定义及更新的。 以下代码,展示的是, 一个Qt 模型被绑定到一个上下文了,因而可以通过QML 文件来访问到。
QQmlEngine engine;
QStringListModel modelData;
QQmlContext *context = new QQmlContext (engine.rootContext());
context-> setContextProperty ("myModel", &modelData);
QQmlComponent component(&engine);
component.setData("import QtQuick 2.0\nListView { model: myModel }", QUrl ());
QObject *window = component.create(context);
注意 ,创建者要负责将它所构造的任何 QQmlContext 删除掉。 在这个例子中, 当 window 这个组件实例被销毁时, 如果 不再需要 context 对象了 , 则, context 应当 显式地销毁。 最简单的实现方式就是,将 window 设置为 context 的亲代对象。
为了简化绑定及维护较大数据集的工作,可将一个上下文对象设置给某个 QQmlContext 。 该上下文对象的所有属性,都可以在该上下文中按照名字来访问,就好像它们是被通过 QQmlContext::setContextProperty () 一个个地添加进去的一 样 。 该属性值的变化,是通过该属性的通知信号来检测到的。设置 一个上下文对象, 与手动地添加及维护上下文属性值相比,既要快一些,又要容易一些。
以下示例,产生的效果与前面一个示例相同,但是,它会使用一个上下文对象。
class MyDataSet : ... {
...
Q_PROPERTY( QAbstractItemModel *myModel READ model NOTIFY modelChanged)
...
};
MyDataSet myDataSet;
QQmlEngine engine;
QQmlContext *context = new QQmlContext (engine.rootContext());
context-> setContextObject (&myDataSet);
QQmlComponent component(&engine);
component.setData("import QtQuick 2.0\nListView { model: myModel }", QUrl ());
component.create(context);
所有 显式通过 QQmlContext::setContextProperty ()添加的属性,其优先级都比其上下文对象的属性的优先级要高。
上下文之间会形成一个层级关系。 此层级关系的根,即为该QML 引擎的 根上下文 。子代 上下文会继承其亲代上下文的上下文属性;如果某个子代 上下文设置了某个已经在其亲代上下文中存在的上下文属性,则, 新的上下文属性会覆盖掉亲代的上下文属性。
下面 这个示例,定义了两个上下文—— context1 和 context2 。第二 个上下文,使用一个新的值覆盖掉了它从第一个上下文所继承到的"b"上下文属性。
QQmlEngine engine;
QQmlContext *context1 = new QQmlContext (engine.rootContext());
QQmlContext *context2 = new QQmlContext (context1);
context1-> setContextProperty ("a", 12);
context1-> setContextProperty ("b", 12);
context2-> setContextProperty ("b", 15);
尽管,在一个上下文中实例化的QML对象并不严格地属于该上下文,但是,它们的绑定却是属性该上下文的。如果某个上下文被销毁了,则,残留的那些QML 对象的属性绑定就不起作用了。
警告: 在某个对象已经被创建之后,再设置其上下文对象或者添加新的上下文属性的话,其开销是狠昂贵的(会导致所有的绑定都重新算值)。因此,在可能的情况下,应当做完了该上下文的“设置”之后,再用它来创建任何的对象。
http://www.kanunu8.com/book3/7781/170819.html
豹
Your opinionsHxLauncher: Launch Android applications by voice commands